package com.siashan.toolkit.core.util;

/**
 * 字符工具类
 *
 * @author siashan
 * @since 1.0.8
 */
public class CharUtils {
    /**
     * 字符常量：空格符 {@code ' '}
     */
    public static char SPACE = ' ';
    /**
     * 字符常量：制表符 {@code '\t'}
     */
    public static char TAB = '	';
    /**
     * 字符常量：点 {@code '.'}
     */
    public static char DOT = '.';
    /**
     * 字符常量：斜杠 {@code '/'}
     */
    public static char SLASH = '/';
    /**
     * 字符常量：反斜杠 {@code '\\'}
     */
    public static char BACKSLASH = '\\';
    /**
     * 字符常量：回车符 {@code '\r'}
     */
    public static char CR = '\r';
    /**
     * 字符常量：换行符 {@code '\n'}
     */
    public static char LF = '\n';
    /**
     * 字符常量：减号（连接符） {@code '-'}
     */
    public static char DASHED = '-';
    /**
     * 字符常量：下划线 {@code '_'}
     */
    public static char UNDERLINE = '_';
    /**
     * 字符常量：逗号 {@code ','}
     */
    public static char COMMA = ',';
    /**
     * 字符常量：花括号（左） <code>'{'</code>
     */
    public static char DELIM_START = '{';
    /**
     * 字符常量：花括号（右） <code>'}'</code>
     */
    public static char DELIM_END = '}';
    /**
     * 字符常量：中括号（左） {@code '['}
     */
    public static char BRACKET_START = '[';
    /**
     * 字符常量：中括号（右） {@code ']'}
     */
    public static char BRACKET_END = ']';
    /**
     * 字符常量：双引号 {@code '"'}
     */
    public static char DOUBLE_QUOTES = '"';
    /**
     * 字符常量：单引号 {@code '\''}
     */
    public static char SINGLE_QUOTE = '\'';
    /**
     * 字符常量：与 {@code '&'}
     */
    public static char AMP = '&';
    /**
     * 字符常量：冒号 {@code ':'}
     */
    public static char COLON = ':';
    /**
     * 字符常量：艾特 {@code '@'}
     */
    public static char AT = '@';

    /**
     * 数组中元素未找到的下标，值为-1
     */
    public static final int INDEX_NOT_FOUND = -1;
    /**
     * 是否空白符<br>
     * 空白符包括空格、制表符、全角空格和不间断空格<br>
     *
     * @param c 字符
     * @return 是否空白符
     * @see Character#isWhitespace(int)
     * @see Character#isSpaceChar(int)
     */
    public static boolean isBlankChar(char c) {
        return isBlankChar((int) c);
    }

    /**
     * 是否空白符<br>
     * 空白符包括空格、制表符、全角空格和不间断空格<br>
     *
     * @param c 字符
     * @return 是否空白符
     * @see Character#isWhitespace(int)
     * @see Character#isSpaceChar(int)
     */
    public static boolean isBlankChar(int c) {
        return Character.isWhitespace(c)
                || Character.isSpaceChar(c)
                || c == '\ufeff'
                || c == '\u202a';
    }

    /**
     * 数组中是否包含元素
     *
     * @param array 数组
     * @param value 被检查的元素
     * @return 是否包含
     * @since 3.0.7
     */
    public static boolean contains(char[] array, char value) {
        return indexOf(array, value) > INDEX_NOT_FOUND;
    }


    /**
     * 返回数组中指定元素所在位置，未找到返回{@link #INDEX_NOT_FOUND}
     *
     * @param array 数组
     * @param value 被检查的元素
     * @return 数组中指定元素所在位置，未找到返回{@link #INDEX_NOT_FOUND}
     */
    public static int indexOf(char[] array, char value) {
        if (null != array) {
            for (int i = 0; i < array.length; i++) {
                if (value == array[i]) {
                    return i;
                }
            }
        }
        return INDEX_NOT_FOUND;
    }
}
